/*****************************************************************************/
// This file is part of Hikari3D.
// 
// Hikari3D is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Hikari3D is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
//
// Copyright 2008 Sebastian Pick
/*****************************************************************************/

#ifndef __SINGLETON_H
#define __SINGLETON_H

// === Defines ============================================================= //


// === Includes ============================================================ //


// === Class Declaration =================================================== //
template<class T>
class CSingleton
{
public:
	// --- Destructor ------------------------------------------------------ //
	virtual ~CSingleton();
	
	// --- Interface ------------------------------------------------------- //
	//! Get the working instance of this singleton.
	static T* getInstance();

protected:
	inline CSingleton();

private:
	static T* _pInstance;

};

// === Static Member Initialization ======================================== //
template<class T> T* CSingleton<T>::_pInstance = 0;


// === Functions =========================================================== //
template<class T>
inline CSingleton<T>::CSingleton()
{

}

template<class T>
CSingleton<T>::~CSingleton()
{
	delete _pInstance;
}

template<class T>
T* CSingleton<T>::getInstance()
{
	if(!_pInstance)
		_pInstance = new T;

	return _pInstance;
}

#endif // __SINGLETON_H

// EOF
